package dao

import (
	"sync"

	"gorm.io/gorm"
)

// Manager DAO 管理器，统一管理所有 DAO 实例
type Manager struct {
	db *gorm.DB

	// 所有 DAO 实例
	Auth   AuthDAO
	Douyin HomepageDAO
}

var (
	managerInstance *Manager
	managerOnce     sync.Once
)

// DAOFactory DAO 工厂函数类型
type DAOFactory struct {
	CreateAuthDAO     func(*gorm.DB) AuthDAO
	CreateHomepageDAO func(*gorm.DB) HomepageDAO
}

var defaultFactory *DAOFactory

// RegisterFactory 注册 DAO 工厂
func RegisterFactory(factory *DAOFactory) {
	defaultFactory = factory
}

// NewManager 创建 DAO 管理器
func NewManager(db *gorm.DB) *Manager {
	if defaultFactory == nil {
		panic("DAO factory not registered, please call RegisterFactory() first")
	}

	return &Manager{
		db:     db,
		Auth:   defaultFactory.CreateAuthDAO(db),
		Douyin: defaultFactory.CreateHomepageDAO(db),
	}
}

// InitManager 初始化全局 DAO 管理器（单例模式）
func InitManager(db *gorm.DB) *Manager {
	managerOnce.Do(func() {
		managerInstance = NewManager(db)
	})
	return managerInstance
}

// GetManager 获取全局 DAO 管理器实例
func GetManager() *Manager {
	if managerInstance == nil {
		panic("DAO manager not initialized, please call InitManager() first")
	}
	return managerInstance
}

// GetDB 获取数据库实例
func (m *Manager) GetDB() *gorm.DB {
	return m.db
}

// GetAuth 获取认证 DAO
func (m *Manager) GetAuth() AuthDAO {
	return m.Auth
}

// GetDouyin 获取抖音业务 DAO
func (m *Manager) GetDouyin() HomepageDAO {
	return m.Douyin
}

// IsInitialized 检查 DAO 管理器是否已初始化
func IsInitialized() bool {
	return managerInstance != nil
}
